上一篇介紹了 Mean Filter。
它的想法很簡單:把周圍的 Pixel 全部平均。
這樣就可以降低一些隨機雜訊。
不過,它也有一個很明顯的缺點。
因為每個 Pixel 的權重都一樣。
所以它不知道哪些 Pixel 比較值得相信。
也不知道哪些 Pixel 可能屬於不同的物體。
結果就是除了雜訊被平均之外,原本清楚的邊緣也一起變模糊了。
這時就可以思考一個問題:
如果離中心越近的 Pixel,通常和中心屬於同一個區域。
那是不是應該讓它們有比較大的權重?
而距離越遠的 Pixel,影響力則慢慢降低?
這就是 Gaussian Filter(高斯濾波) 的核心概念。
先回顧 Mean Filter 的 Kernel。
1/9 1/9 1/9
1/9 1/9 1/9
1/9 1/9 1/9
每個位置都一樣重要。
Gaussian Filter 則不同。
例如一個常見的 3×3 Gaussian Kernel。
1 2 1
2 4 2
1 2 1
最後再除以 16。
也就是:
1/16 2/16 1/16
2/16 4/16 2/16
1/16 2/16 1/16
可以發現,中心 Pixel 的權重最大,越往外,權重越小。
因此新的 Pixel 會更相信附近的資訊,而不是把所有 Pixel 都一視同仁。
假如今天要估計一個人的身高,你會參考誰?
直覺上,大多數人應該會先參考兄弟姊妹、父母等和他關係較近的人,而不是隨機找十個陌生人平均。
在影像中也是類似的概念。
距離中心越近的 Pixel,通常越有可能屬於同一個物體。
因此它們提供的資訊,也比較具有參考價值。
Gaussian Filter 就是利用這個想法。
讓距離越近的 Pixel 有越高的權重。
OpenCV 已經提供了 Gaussian Filter。
使用方式比 Mean Filter 更簡單。
import cv2
import matplotlib.pyplot as plt
img = cv2.imread("dog.jpeg")
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
result = cv2.GaussianBlur(img, (5,5), 0)
其中:
(5,5) 表示 Kernel 的大小。sigma,設定為 0 時,OpenCV 會自動計算適合的值。接著把結果和原圖一起比較。
plt.figure(figsize=(10,5))
plt.subplot(1,2,1)
plt.imshow(img)
plt.title("Original")
plt.axis("off")
plt.subplot(1,2,2)
plt.imshow(result)
plt.title("Gaussian Filter")
plt.axis("off")
plt.tight_layout()
plt.show()
結果:

可以觀察看看。
圖片雖然變得比較平滑,但物體的輪廓通常會比 Mean Filter 保留得更好一些。
和 Mean Filter 一樣,Gaussian Filter 也可以使用不同大小的 Kernel。
例如:
blur3 = cv2.GaussianBlur(img, (3,3), 0)
blur5 = cv2.GaussianBlur(img, (5,5), 0)
blur9 = cv2.GaussianBlur(img, (9,9), 0)
Kernel 越大,每次參考的 Pixel 越多,圖片就會變得越模糊。
不過因為 Gaussian Filter 的權重是逐漸遞減的。
即使 Kernel 變大,模糊的方式通常也會比 Mean Filter 更自然。
Gaussian Filter 是影像處理中非常常見的前處理方法。
例如:
之後會介紹的 Canny Edge Detection。
第一步其實就是先使用 Gaussian Filter。
目的就是先去除部分雜訊,避免後續把雜訊誤判成邊緣。
兩者都是利用周圍 Pixel 來平滑圖片。
最大的差別在於權重的分配方式。
| Mean Filter | Gaussian Filter |
|---|---|
| 每個 Pixel 權重相同 | 越靠近中心權重越大 |
| 計算方式簡單 | 更符合鄰近 Pixel 的特性 |
| 容易讓邊緣變模糊 | 通常能保留較多細節 |
Gaussian Filter 並不是把 Mean Filter 推翻,而是延續了「利用鄰近 Pixel 平滑圖片」這個想法,再進一步調整權重的設計。
上一篇介紹了 Mean Filter。
今天則看到另一種更常見的平滑方法:
Gaussian Filter。
它和 Mean Filter 一樣,都是利用 Convolution 和 Kernel 來重新計算每個 Pixel。
不同的是,Gaussian Filter 不再把所有 Pixel 視為一樣重要。
而是讓距離中心越近的 Pixel 擁有更大的影響力。
也因為如此,它通常能在降低雜訊的同時,保留更多影像細節。
不過,Gaussian Filter 對所有種類的雜訊都有效嗎?
如果圖片中出現的是一顆一顆的黑白雜點,它的效果就未必理想。
明天,我們就來介紹另一種完全不同思路的濾波方法。
Median Filter(中值濾波)。